package listNodePractice;

public class Class24 {
    public ListNode swapPairs(ListNode head) {
        return   reverseKGroup(head,2);
    }

    ListNode reverseKGroup(ListNode head, int k) {
        if (head == null) return null;
        // 区间 [a, b) 包含 k 个待反转元素
        ListNode a, b;
        a = b = head;

//        todo:明白了   /** 反转区间 [a, b) 的元素，注意是左闭右开 */　　左闭右开的含义
//        for循环以后b已经指向了
        for (int i = 0; i < k; i++) {
            // 不足 k 个，不需要反转，base case
            if (b == null) return head;
            b = b.next;
        }
        // 反转前 k 个元素
        ListNode newHead = reverse(a, b);
        // 递归反转后续链表并连接起来
        a.next = reverseKGroup(b, k);
        return newHead;
    }



    /** 反转区间 [a, b) 的元素，注意是左闭右开 */
    //todo:只会翻转　b前面的节点　不包含b节点
    ListNode reverse(ListNode a, ListNode b) {
        ListNode pre, cur, nxt;
        pre = null; cur = a; nxt = a;
        // while 终止的条件改一下就行了
        while (cur != b) {
            nxt = cur.next;
            cur.next = pre;
            pre = cur;
            cur = nxt;
        }
        // 返回反转后的头结点
        return pre;
    }




    //翻转链表　
    public ListNode reverseList(ListNode head) {
        ListNode  pre,cur,next;
        pre=null;
        cur=head;
        next=head;
        while (cur!=null){
            next=cur.next;
            cur.next=pre;
            pre=cur;
            cur=next;
        }
        return  pre;
    }




    public static void main(String[] args) {
        ListNode listNode1 = new ListNode(1);
        ListNode listNode2 = new ListNode(2);
        ListNode listNode3 = new ListNode(3);
        ListNode listNode4 = new ListNode(4);
        ListNode listNode5 = new ListNode(5);
        listNode1.next=listNode2;
        listNode2.next=listNode3;
        listNode3.next=listNode4;
        listNode4.next=listNode5;

        Class24 class24 = new Class24();
        ListNode listNode = class24.reverse(listNode1,listNode3);
        while (listNode!=null){
            System.out.println(listNode.val);
            listNode=listNode.next;
        }
    }




}
